%define pg.RootNamespace Foo

%token a

Vector = struct(x! : Expression?, y : Expression, z : [Expression], w : Expression)

Expression:
    Query (operand : Expression?)
    BulkQuery (operands : [Expression])
    Binary (left : Expression, right : Expression):
        Add
        Subtract
        Multiply:
            ScalarMultiply
            MatrixMultiply
        Divide

public class Point:
    X! : int
    Y! : int

IVisitor.Visit(n : Vector
                 | Expression
                 | Point,
               d : int) -> string

%%

S:
    A A A A

A:
    a
    E

E:
    =>: pass

%%
